数据缓存

您所在的位置:网站首页 队列定义 c语言代码 数据缓存

数据缓存

2024-01-26 20:10| 来源: 网络整理| 查看: 265

在通讯场景下,两端的数据处理能力不同,或者受传输单次数据传输量的的限制,很多时候我们都需要将数据进行缓存,然后在进行处理,fifo就是一种很好的数据缓存模型,下面我写了一个实例,可直接移植使用

注意,当数据长度大于fifo缓存大小的时候,会直接覆盖,请合理设置fifo的buf大小,可以通过fifo_create设置缓存大小

typedef unsigned char uint8; typedef unsigned short uint16; #define MAX_FIFO_BUFFER_LEN 21 typedef struct _fifo_t { uint8 *buff; uint16 fifo_len; uint16 data_len; uint16 read_index; uint16 write_index; }fifo_t; fifo_t *g_user_fifo; /*********************************************************************************************** *函数名 : write_fifo *函数功能描述 : 向fifo中写入数据 *函数参数 : fifo;data,待写入数据;len,待写入数据长度 *函数返回值 : 实际写入数据长度 *作者 :layne ***********************************************************************************************/ uint16 write_fifo(fifo_t *fifo, uint8 *data, uint16 len) { uint16 w_len = len; if(len >= fifo->fifo_len) { memcpy(fifo->buff, data + len - fifo->fifo_len, fifo->fifo_len); fifo->read_index = 0; fifo->write_index = fifo->fifo_len; fifo->data_len = fifo->fifo_len; w_len = fifo->fifo_len; } else { if(fifo->write_index + len > fifo->fifo_len) { uint16 tail_len = (fifo->write_index + len) % fifo->fifo_len; memcpy(fifo->buff + fifo->write_index, data, len - tail_len); memcpy(fifo->buff, data + len - tail_len, tail_len); fifo->write_index = tail_len; } else { memcpy(fifo->buff + fifo->write_index, data, len); fifo->write_index += len; } if(fifo->data_len + len > fifo->fifo_len) { fifo->read_index = (fifo->read_index + fifo->data_len + len - fifo->fifo_len) % fifo->fifo_len; fifo->data_len = fifo->fifo_len; } else { fifo->data_len += len; } } return w_len; } /*********************************************************************************************** *函数名 : read_fifo *函数功能描述 : 从fifo中读取数据 *函数参数 : fifo;data,读取数据缓存;len,读取长度 *函数返回值 : 实际读出数据长度 *作者 :layne ***********************************************************************************************/ uint16 read_fifo(fifo_t *fifo, uint8 *data, uint16 len) { uint16 r_len = len; if(fifo->data_len < len) r_len = fifo->data_len; if(fifo->read_index + r_len > fifo->fifo_len) { uint16 tail_len = (fifo->read_index + r_len) % fifo->fifo_len; memcpy(data, fifo->buff + fifo->read_index, r_len - tail_len); memcpy(data + r_len - tail_len, fifo->buff, tail_len); fifo->read_index = tail_len; } else { memcpy(data, fifo->buff + fifo->read_index, r_len); fifo->read_index += r_len; } fifo->data_len -= r_len; if(0 == fifo->data_len) { fifo->read_index = 0; fifo->write_index = 0; } return r_len; } /*********************************************************************************************** *函数名 : fifo_create *函数功能描述 : 创建一个fifo *函数参数 : fifo_buf_len,fifo缓存buf的大小 *函数返回值 : fifo_t *,fifo指针 *作者 :layne ***********************************************************************************************/ fifo_t *fifo_create(uint16 fifo_buf_len) { fifo_t *m_fifo; m_fifo = (fifo_t *)malloc(sizeof(fifo_t)); m_fifo->buff = (uint8 *)malloc(fifo_buf_len); if(NULL == m_fifo->buff){ free(m_fifo); return NULL; } m_fifo->fifo_len = fifo_buf_len; m_fifo->data_len = 0; m_fifo->read_index = 0; m_fifo->write_index = 0; return m_fifo; } /*********************************************************************************************** *函数名 : fifo_release *函数功能描述 : 释放一个fifo *函数参数 : fifo,待释放函数指针 *函数返回值 : void *作者 :layne ***********************************************************************************************/ void fifo_release(fifo_t *fifo) { free(fifo->buff); free(fifo); } /*********************************************************************************************** *函数名 : test_func *函数功能描述 : 测试函数,控制台输入0为写入测试,1为读取测试,其他值退出 *函数参数 : void *函数返回值 : void *作者 :layne ***********************************************************************************************/ void test_func() { uint8 w[5] = {0x45, 0x34, 0x53, 0x12, 0x11}; uint8 r[7]; int i=0; int read_len=0; g_user_fifo = fifo_create(MAX_FIFO_BUFFER_LEN); while(i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3